package main.java.sokoban;

import java.util.Stack;

/**
 * GameState 类用于保存和恢复游戏状态。
 */
public class GameState {
    // 保存地图历史状态的栈
    Stack<char[][]> mapHistory = new Stack<>();
    // 保存玩家位置历史状态的栈
    Stack<int[]> playerHistory = new Stack<>();

    /**
     * 保存当前地图和玩家位置的状态。
     *
     * @param map       当前的地图二维数组
     * @param playerRow 玩家所在的行
     * @param playerCol 玩家所在的列
     */
    public void saveState(char[][] map, int playerRow, int playerCol) {
        char[][] copy = new char[map.length][map[0].length];
        for (int i = 0; i < map.length; i++)
            copy[i] = map[i].clone();

        mapHistory.push(copy);
        playerHistory.push(new int[]{playerRow, playerCol});
    }

    /**
     * 撤销操作：返回上一次的地图状态。
     *
     * @return 上一次的地图二维数组，若没有历史记录则返回 null
     */
    public char[][] undoMap() {
        return mapHistory.isEmpty() ? null : mapHistory.pop();
    }

    /**
     * 撤销操作：返回上一次的玩家位置。
     *
     * @return 上一次的玩家位置数组，若没有历史记录则返回 null
     */
    public int[] undoPlayer() {
        return playerHistory.isEmpty() ? null : playerHistory.pop();
    }

    /**
     * 判断是否可以撤销。
     *
     * @return 如果存在历史状态返回 true，否则 false
     */
    public boolean canUndo() {
        return !mapHistory.isEmpty();
    }
}
